﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ModuloAdministrativo;
using ModuloAdministrativo.WSsiar;
using ModuloAdministrativo.Classes;

namespace ModuloAdministrativo
{
    public partial class VendasForm : Form
    {
        double total = 0;
        double desconto = 0;
        double totalcomdesconto = 0;
        ListViewItem item;
        ServicosSIARSoapClient ws = new ServicosSIARSoapClient();

        VendaDelivery novavendaDelivery = null;
        //VendaSalao novaVendaSalao = null;
        List<Mesa> mesaAberta = new List<Mesa>();

        bool clienteCadastrado;
        WSsiar.PessoaBean cliente;
        WSsiar.PessoaBean usuarioAtual;

        public VendasForm()
        {
            InitializeComponent();
            this.recarregarTela();
            this.mesasAbertas();
        }
        
        private void VendasForm_Load(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Maximized;
        }

        private void text_changed(object sender, EventArgs e)
        {
            if (telefoneTB.Text.Length == 8)
            {
                try
                {
                    cliente = ws.ClienteBuscar(telefoneTB.Text);
                    nomeTB.Text = cliente.Nome.ToString();
                    WSsiar.EnderecoBean[] endereco = ws.enderecoListar();
                    foreach (WSsiar.EnderecoBean end in endereco)
                    {
                        if (end.ID_Cliente == cliente.Id)
                        {
                            ruaTB.Text = end.Rua.ToString();
                            if (end.Complemento != null)
                                complementoTB.Text = end.Complemento.ToString();
                            numeroTB.Text = end.Numero.ToString();
                            if (end.Cidade != null)
                                cidadeTB.Text = end.Cidade.ToString();
                            bairroTB.Text = end.Bairro.ToString();
                        }
                    }
                    clienteCadastrado = true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Número de telefone não cadastrado!\n");
                }
            }
            if (telefoneTB.Text == "")
            {
                nomeTB.Text = "";
                telefoneTB.Text = "";
                ruaTB.Text = "";
                complementoTB.Text = "";
                numeroTB.Text = "";
                cidadeTB.Text = "";
                bairroTB.Text = "";
            }
        }

        /// <summary>
        /// Limpa todos os campos da tela, preparando-a para um novo pedido.
        /// Recarrega os itens do cardápio para assegurar que não zerou o estoque.
        /// </summary>
        private void recarregarTela()
        {
            nomeTB.Text = "";
            telefoneTB.Text = "";
            ruaTB.Text = "";
            complementoTB.Text = "";
            numeroTB.Text = "";
            cidadeTB.Text = "";
            bairroTB.Text = "";

            //recarrega a lista de bebidas
            WSsiar.BebidaBean[] listaDeBebidas = ws.BebidaListar();
            BebidaLV.Items.Clear();
            for (int i = 0; i < listaDeBebidas.Length; i++)
            {
                ListViewItem item = new ListViewItem(listaDeBebidas[i].Nome + " " + listaDeBebidas[i].Tipo);
                ListViewItem item2 = new ListViewItem(listaDeBebidas[i].Nome + " " + listaDeBebidas[i].Tipo);
                item.SubItems.Add(listaDeBebidas[i].Id.ToString());
                item2.SubItems.Add(listaDeBebidas[i].Id.ToString());
                BebidaLV.Items.Add(item);
                refrigerantesSalaoLV.Items.Add(item2);
            }
            TotalTB.Text = "0.0";
            DescontoTB.Text = "0.0";
            clienteCadastrado = false;

            //recarrega lista de pizzas
            WSsiar.PratoBean[] pratos = ws.PratoListar();            
            PizzaLV.Items.Clear();
            foreach(PratoBean p in pratos)
            {
                if(p.Tipo.Equals("Pizza"))
                {
                    ListViewItem item = new ListViewItem(p.Nome);
                    ListViewItem item2 = new ListViewItem(p.Nome);
                    item.SubItems.Add(p.Id.ToString());
                    item2.SubItems.Add(p.Id.ToString());
                    PizzaLV.Items.Add(item);
                    pizzaSalaoLV.Items.Add(item2);
                }
                else if (p.Tipo.Equals("Massa"))
                {
                    ListViewItem item = new ListViewItem(p.Nome);
                    ListViewItem item2 = new ListViewItem(p.Nome);
                    item.SubItems.Add(p.Id.ToString());
                    item2.SubItems.Add(p.Id.ToString());
                    massaDeliveryLV.Items.Add(item);
                    massaSalaoLV.Items.Add(item2);

                }
            }          

            //limpa a comanda.
            ComandaLV.Items.Clear();
        }

        /// <summary>
        /// Método responsável por receber a instância do funcionário logado no sistema.
        /// </summary>
        /// <param name="?"></param>
        public void setUsuarioAtual(WSsiar.PessoaBean funcionario)
        {
            this.usuarioAtual = funcionario;
        }

        /// <summary>
        /// Método responsável pelo pedido de bebidas.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BebidaLV_ItemActivate(object sender, EventArgs e)
        {
            if (this.novavendaDelivery == null)
            {
                this.novavendaDelivery = new VendaDelivery();
                novavendaDelivery.HoraA = DateTime.Now;
                novavendaDelivery.Estado = "Em espera";
                novavendaDelivery.Funcionario = usuarioAtual;
            }

            int id = int.Parse(BebidaLV.FocusedItem.SubItems[1].Text);
            WSsiar.BebidaBean bebida = ws.BebidaBuscar(id);
            item = new ListViewItem("1");
            item.SubItems.Add(bebida.Nome);
            item.SubItems.Add(bebida.Preco.ToString());
            item.SubItems.Add(bebida.Preco.ToString());
            ComandaLV.Items.Add(item);
            
            total = total + bebida.Preco;
            this.atualizarTotalTB();

            novavendaDelivery.novoPedidoBebida(bebida);
        }
        private void PizzaLV_ItemActivate(object sender, EventArgs e)
        {
            if (this.novavendaDelivery == null)
            {
                this.novavendaDelivery = new VendaDelivery();
                novavendaDelivery.HoraA = DateTime.Now;
                novavendaDelivery.Estado = "Em espera";
                novavendaDelivery.Funcionario = usuarioAtual;
            }

            int id = int.Parse(PizzaLV.FocusedItem.SubItems[1].Text);
            WSsiar.PratoBean prato = ws.PratoBuscar(id);
            item = new ListViewItem("1");
            item.SubItems.Add(prato.Nome);
            item.SubItems.Add(prato.Preco.ToString());
            item.SubItems.Add(prato.Preco.ToString());
            ComandaLV.Items.Add(item);

            total = total + prato.Preco;
            this.atualizarTotalTB();

            novavendaDelivery.novoPedidoPrato(prato);
        }


        private void FinalizarVendaBT_Click(object sender, EventArgs e)
        {
            FinalizarVendaForm form = new FinalizarVendaForm();
            form.setValor(float.Parse(TotalTB.Text));
           
            if (form.ShowDialog() == DialogResult.OK)
            {
                this.clienteCadastrar();
                ws.VendaCadastrar(novavendaDelivery.getVenda());
                novavendaDelivery.salvarPedidos();

                novavendaDelivery.formadepagamento = form.formadepagamento;
                novavendaDelivery.troco = form.troco;
                novavendaDelivery.valorAReceber = form.recebido;
                novavendaDelivery.total = this.total;
                novavendaDelivery.desconto = this.desconto;
                novavendaDelivery.totalcomdesconto = this.totalcomdesconto;

                this.impressora.Print();

                this.recarregarTela();
                novavendaDelivery = null;
            }
        }


        /// <summary>
        /// Verifica se o cliente já é cadastrado, senão o cadastro é efetuado.
        /// </summary>
        private void clienteCadastrar()
        {
            if (!clienteCadastrado)
            {
                WSsiar.Pessoa pessoa = new WSsiar.Pessoa();
                WSsiar.Endereco endereco = new WSsiar.Endereco();

                pessoa.Nome = nomeTB.Text;
                pessoa.Telefone = telefoneTB.Text;

                endereco.Bairro = bairroTB.Text;
                endereco.Cidade = cidadeTB.Text;
                endereco.Rua = ruaTB.Text;
                endereco.Numero = int.Parse(numeroTB.Text);
                endereco.Telefone = telefoneTB.Text;
                endereco.Complemento = complementoTB.Text;
                ws.ClienteCadastrar(pessoa, endereco);

                cliente = ws.ClienteBuscar(pessoa.Telefone);
            }

            novavendaDelivery.setId_Cliente(cliente);
        }

        private void button7_Click(object sender, EventArgs e)
        {
        }

        /// <summary>
        /// método recupera a alteração do desconto e chama o método atualizar total.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DescontoTB_TextChanged(object sender, EventArgs e)
        {
            this.atualizarTotalTB();
        }

        /// <summary>
        /// Método atualiza o total da conta
        /// </summary>
        private void atualizarTotalTB()
        {
            desconto = double.Parse(DescontoTB.Text);
            totalcomdesconto = total - desconto;
            TotalTB.Text = totalcomdesconto.ToString();
        }

        private void atualizarCliente()
        {
            WSsiar.PessoaBean cli = ws.ClienteBuscar(telefoneTB.Text);
            WSsiar.EnderecoBean end = ws.enderecoBuscar(cli.Id);
            cli.Nome = nomeTB.Text;
            end.Rua = ruaTB.Text;
            end.Numero = int.Parse(numeroTB.Text);
            end.Bairro = bairroTB.Text;
            end.Cidade = cidadeTB.Text;
            end.Complemento = complementoTB.Text;
            ws.ClienteAtualizar(cli, end);
        }

        private void impressora_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            if(novavendaDelivery != null)
                e.Graphics.DrawString(novavendaDelivery.imprimirConta(), DescontoTB.Font, new SolidBrush(Color.Black), new Point(5, 50));
            //else
                //e.Graphics.DrawString(novavendaSalao.imprimirConta(), DescontoTB.Font, new SolidBrush(Color.Black), new Point(5, 50));
        }

        private void button11_Click(object sender, EventArgs e)
        {
            
        }

        private void ComandaLV_ItemActivate(object sender, EventArgs e)
        {
            string nome = ComandaLV.FocusedItem.SubItems[1].Text;
            novavendaDelivery.removerPedido(nome);            
            this.atualizarListView();            
        }

        public void atualizarListView()
        {
            double tempBebida = 0;
            double tempPrato = 0;
            double tempTotal = 0;
            int i;
            ComandaLV.Items.Clear();
            if(novavendaDelivery.bebidas.Count != 0)
            {
                for (i = 0; i < novavendaDelivery.bebidas.Count; i++)
                {
                    ListViewItem item = new ListViewItem("1");
                    item.SubItems.Add(novavendaDelivery.bebidas[i].Nome);
                    item.SubItems.Add(novavendaDelivery.bebidas[i].Preco.ToString());
                    item.SubItems.Add(novavendaDelivery.bebidas[i].Preco.ToString());
                    ComandaLV.Items.Add(item);
                    tempBebida = tempBebida + novavendaDelivery.bebidas[i].Preco;
                }
                
            }            

            if (novavendaDelivery.pratos.Count != 0)
            {
                for (i = 0; i < novavendaDelivery.pratos.Count; i++)
                {
                    ListViewItem item = new ListViewItem("1");
                    item.SubItems.Add(novavendaDelivery.pratos[i].Nome);
                    item.SubItems.Add(novavendaDelivery.pratos[i].Preco.ToString());
                    item.SubItems.Add(novavendaDelivery.pratos[i].Preco.ToString());
                    ComandaLV.Items.Add(item);
                    tempPrato = tempPrato + novavendaDelivery.pratos[i].Preco;
                }
            }
            tempTotal = tempBebida + tempPrato;
            TotalTB.Text = tempTotal.ToString();
        }


        //Venda Salão

        public void mesasAbertas()
        {
            VendaBean[] vendas = ws.VendaListar();
            foreach (VendaBean venda in vendas) {
                bool testa = false;
                mesasSalaoLV.Items.Add(venda.Num_Mesa.ToString());
                foreach (Mesa mesa in this.mesaAberta) {
                    if (venda.Num_Mesa == mesa.numMesa) 
                    {
                        testa = true;
                    }                    
                }
                if (testa == false) {
                    Mesa nova = new Mesa(venda.Num_Mesa);
                    mesaAberta.Add(nova);
                }
                testa = false;
            }
            atualizaListaMesas();
        }
        public void atualizaListaMesas() {
            PedidoBean[] pedidos = ws.PedidoListar();
            foreach (PedidoBean pedido in pedidos)
            {
                if (pedido.Num_Mesa != null)
                {
                    
                    foreach (Mesa mesa in mesaAberta)
                    {
                        if (mesa.numMesa == pedido.Num_Mesa)
                        {
                            mesa.adicionarVenda(pedido);
                        }
                    }
                     
                }
             
            }
        }
        private void refrigerantesSalaoLV_ItemActivate(object sender, EventArgs e)
        {
            //recupera a mesa
            int numMesa = int.Parse(mesasSalaoLV.FocusedItem.SubItems[0].Text);
            //busca bebida
            int id = int.Parse(refrigerantesSalaoLV.FocusedItem.SubItems[1].Text);
            WSsiar.BebidaBean bebida = ws.BebidaBuscar(id);
            foreach (Mesa mesa in mesaAberta) {
                if (mesa.numMesa == numMesa) {
                    mesa.adicionarBebida(bebida, usuarioAtual.Id, numMesa);
                    totalSalaoTB.Text = mesa.Total.ToString();
                }
            }
            //addiciona no listView
            item = new ListViewItem("1");
            item.SubItems.Add(bebida.Nome);
            item.SubItems.Add(bebida.Preco.ToString());
            item.SubItems.Add(bebida.Preco.ToString());
            comandaSalaoLV.Items.Add(item);

            //total = total + bebida.Preco;
            //this.atualizarTotalTB();

            //novavendaDelivery.novoPedidoBebida(bebida);
        }

        private void mesasSalaoLV_ItemActivate(object sender, EventArgs e)
        {
            comandaSalaoLV.Items.Clear();
            int numMesa = int.Parse(mesasSalaoLV.FocusedItem.SubItems[0].Text);
            foreach (Mesa mesa in mesaAberta)
            {
                if (mesa.numMesa == numMesa)
                {
                    foreach (PedidoBean pedido in mesa.getPedidos()) {
                        if (pedido.Id_Bebida != null) {
                            BebidaBean bebida = ws.BebidaBuscar(pedido.Id_Bebida);
                            item = new ListViewItem("1");
                            item.SubItems.Add(bebida.Nome);
                            item.SubItems.Add(bebida.Preco.ToString());
                            comandaSalaoLV.Items.Add(item);
                        }
                        else if (pedido.Id_Prato != null) {
                            PratoBean prato = ws.PratoBuscar(pedido.Id_Bebida);
                            item = new ListViewItem("1");
                            item.SubItems.Add(prato.Nome);
                            item.SubItems.Add(prato.Preco.ToString());
                            comandaSalaoLV.Items.Add(item);
                        }
                    
                    }
                }
            }

        }

        private void pizzaSalaoLV_ItemActivate(object sender, EventArgs e)
        {
            //recupera a mesa
            int numMesa = int.Parse(mesasSalaoLV.FocusedItem.SubItems[0].Text);
            //busca o prato
            int id = int.Parse(pizzaSalaoLV.FocusedItem.SubItems[1].Text);
            WSsiar.PratoBean prato = ws.PratoBuscar(id);
            foreach (Mesa mesa in mesaAberta)
            {
                if (mesa.numMesa == numMesa)
                {
                    mesa.adicionarPrato(prato, usuarioAtual.Id, numMesa);
                    totalSalaoTB.Text = mesa.Total.ToString();
                }
            }
            //addiciona no listView
            item = new ListViewItem("1");
            item.SubItems.Add(prato.Nome);
            item.SubItems.Add(prato.Preco.ToString());
            item.SubItems.Add(prato.Preco.ToString());
            comandaSalaoLV.Items.Add(item);

            //total = total + bebida.Preco;
            //this.atualizarTotalTB();

            //novavendaDelivery.novoPedidoBebida(bebida);
        }

        private void massaSalaoLV_ItemActivate(object sender, EventArgs e)
        {
            //recupera a mesa
            int numMesa = int.Parse(mesasSalaoLV.FocusedItem.SubItems[0].Text);
            //busca o prato
            int id = int.Parse(massaSalaoLV.FocusedItem.SubItems[1].Text);
            WSsiar.PratoBean prato = ws.PratoBuscar(id);
            foreach (Mesa mesa in mesaAberta)
            {
                if (mesa.numMesa == numMesa)
                {
                    mesa.adicionarPrato(prato, usuarioAtual.Id, numMesa);
                    totalSalaoTB.Text = mesa.Total.ToString();
                }
            }
            //addiciona no listView
            item = new ListViewItem("1");
            item.SubItems.Add(prato.Nome);
            item.SubItems.Add(prato.Preco.ToString());
            item.SubItems.Add(prato.Preco.ToString());
            comandaSalaoLV.Items.Add(item);

            //total = total + bebida.Preco;
            //this.atualizarTotalTB();

            //novavendaDelivery.novoPedidoBebida(bebida);
        }

        private void descontoSalaoTB_TextChanged(object sender, EventArgs e)
        {
            if (descontoSalaoTB.Text.Length != null && descontoSalaoTB.Text.Length != 0)
            {
                int temp_nummesa = int.Parse(mesasSalaoLV.FocusedItem.SubItems[0].Text);
                foreach (Mesa mesa in mesaAberta)
                {
                    if (mesa.numMesa == temp_nummesa)
                    {
                        mesa.desconto = float.Parse(descontoSalaoTB.Text);
                        totalSalaoTB.Text = ((float)total - mesa.desconto).ToString();
                    }
                }                
            }
        }

        private void button8_Click(object sender, EventArgs e)
        {
            Mesa mesa = null;
            int id_venda;

            int temp_nummesa = int.Parse(mesasSalaoLV.FocusedItem.SubItems[0].Text);
                foreach (Mesa me in mesaAberta)
                {
                    if (me.numMesa == temp_nummesa)
                    {
                        mesa = me;
                    }
                }
            
            
            FinalizarVendaForm form = new FinalizarVendaForm();
            form.setValor((float)(mesa.Total-mesa.desconto));

            if (form.ShowDialog() == DialogResult.OK)
            {
                id_venda = ws.VendaBuscarPorMesa(mesa.numMesa).Id;
                

                this.impressora.Print();

                this.recarregarTela();
                novavendaDelivery = null;
            }
        }
    }
}